<?php

namespace Kuoqi;
use Kuoqi;
use Kuoqi\Params;
use Kuoqi\Error;


/**
 * Class App
 * @package Kuoqi
 * User kuoqi
 * Datetime 2022/2/26 21:58
 * Remark 应用模块的主模块信息
 * 核心组键 - app模块作为应用层基础模块，是应用层最基础的模块，里面继承所有已有的模块信息，并不只是单纯的继承某一个对象或者方法
 */
class App{


    /**
     * @var null 当前路由信息，正式使用时候为对象
     * User kuoqi
     * Datetime 2022/2/27 9:49
     * Remark
     */
    public $route = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 13:22
     * Remark 控制器对象信息
     */
    public $controller = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 22:36
     * Remark 动作方法信息
     */
    public $actioner = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 10:35
     * Remark 控制器路由信息
     */
    public $route_controller  = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 11:09
     * Remark 控制器基础路径
     */
    public $path_controller = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/28 10:48
     * Remark 基础模板的路径信息
     */
    public $path_viewer = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/27 10:35
     * Remark 模板路由信息
     */
    public $route_view = null;

    /**
     * @var null
     * User kuoqi
     * Datetime 2022/2/28 11:05
     * Remark 响应输出模块
     */
    public $response = null;

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/2/28 11:16
     * Remark 响应核心，默认web,cli等等
     */
    protected $core = 'web';

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/2/28 11:23
     * Remark 输出方式 也是type [web，json...]
     */
    protected $format = 'web';

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/2/28 12:53
     * Remark 控制器额外字段
     */
    public $ctl_extra = 'Controller';

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/2/28 15:20
     * Remark app存储的数据信息
     */
    public $action_return = '';

    /**
     * @var bool
     * User kuoqi
     * Datetime 2022/3/1 15:57
     * Remark 是否启用layout模块,
     */
    public $layout_id = false;

    /**
     * @var bool
     * User kuoqi
     * Datetime 2022/2/28 15:20
     * Remark 是否启用view模块
     */
    public $use_view = false;

    /**
     * @var array
     * User kuoqi
     * Datetime 2022/3/1 16:14
     * Remark 额外参数信息
     */
    public $args_extra = array();

    /**
     * User kuoqi
     * Datetime 2022/2/26 22:12
     * Remark 基础的运行入口
     */
    public function running(){
        Error::process('应用运行【running】开始');
        \Kuoqi\Params::$HOME||(\Kuoqi\Params::$HOME = \Kuoqi\Params::$APP_ROOT.'/web');//WEB_ROOT系统根目录的路径信息
        $this->__initCommonConfig();
        $this->__init();
        $this->__initPrivateConfig();
        Kuoqi::useApp($this);//将app信息注册到列表中
        return ;
    }

    /**
     * @param $behavior
     * User kuoqi
     * Datetime 2022/2/27 13:24
     * Remark 绑定一个行为动作到本app中
     */
    public function  bindBehavior($behavior){
        Error::process('绑定应用行为习惯');
//        if(is_array($behavior)){
//            //配置format格式化的行为方式
//            if(isset($behavior['format'])){
//                $this->format = $behavior['format'];
//            }
//        }
        //todo--其他绑定行为到本app中
    }

    /**
     * @param $stream
     * User kuoqi
     * Datetime 2022/2/27 22:40
     * Remark 绑定动作响应的数据信息
     */
    public function bindAction($stream){
        //todo--绑定动作响应的数据信息
        $this->action_return = $stream;
    }

    /**
     * @return string
     * User kuoqi
     * Datetime 2022/2/28 13:58
     * Remark 获取内核信息 core
     */
    public function getCore(){
        return $this->core;
    }

    /**
     * @return string
     * User kuoqi
     * Datetime 2022/2/28 13:58
     * Remark 获取格式化信息 format
     */
    public function getFormat(){
        return $this->format;
    }

    /**
     * @param $format
     * @return mixed
     * User kuoqi
     * Datetime 2022/3/1 17:46
     * Remark 设置格式化信息
     */
    public function setFormat($format){
        return $this->format = $format;
    }

    /**
     * 获取并重置完整版本的view路径信息
     * @param $tpid
     * @return string
     * @throws \Kuoqi\Error
     */
    public function perfectViewpath($tpid){
        $route = new \Kuoqi\Route($tpid);
        return $route->flushView();
    }

    /**
     * @param $args
     * @param null $extArgs
     * User kuoqi
     * Datetime 2022/3/1 16:13
     * Remark 配置参数函数
     */
    public function setAssign($args,$extArgs = null){
        if(is_array($args)){
            foreach($args as $k=>$v){
                $this->setAssign($k,$v);
            }
        }else{
            $this->args_extra[$args] = $extArgs;
        }
    }

    /**
     * @param array $extraArgs
     * @return array
     * User kuoqi
     * Datetime 2022/3/1 16:21
     * Remark 获取参数信息
     */
    public function getAssigns($extraArgs = array()){
        return array_merge($this->args_extra,$extraArgs);
    }

    /**
     * User kuoqi
     * Datetime 2022/2/26 22:59
     * Remark 初始化的实际执行操作
     */
    public function __init(){
        Error::process('应用程序初始化');
        //输入部分的初始化
        $this->__initInput();
        //初始化用户行为部分behavior
        $this->__initBehavior();
    }

    /**
     * User kuoqi
     * Datetime 2022/2/26 23:14
     * Remark 输入部分的初始化
     */
    public function __initInput()
    {
        Error::process('应用程序输出初始化');
        //链接模块初始化，初始化url的操作信息
        $url = new \Kuoqi\Url();
        $url->getInput();//获取输入作为最基础的信息
        //尝试解析链接信息
        //将当前链接解析为一个可以使用的路由信息
        $this->route = $url->exec2route();
        //将get多余的路由信息写入到get参数信息中
        Config::setInputget($this->route->params);
        //将post得到的数据写入到基础数据中
        Config::setInputpost($_POST);
        //将json数据写入到指定信息中
        $stream = file_get_contents('PHP://input');
        $json = json_decode($stream,true);
        if($json){
            Config::setInputjson($json);
        }
//        $params = \Kuoqi\Route::urlparam2arr($stream);
//        if(\Kuoqi\Params::$METHOD=='POST'){
//            Config::setInputpost($params);
//        }else if(\Kuoqi\Params::$METHOD=='GET'){
//            Config::setInputget($params);
//        }
    }

    /**
     * User kuoqi
     * Datetime 2022/2/27 10:16
     * Remark 初始化用户行为部分，包含用户使用控制器，用户使用模板部分
     */
    public function __initBehavior()
    {
        //尝试加载控制器
        Error::process('应用行为初始化');

        //获取控制器文件基础信息
        $this->path_controller =
            'App'.
            Params::$RL . $this->route->m .
            Params::$RL.'Controller'.
            Params::$RL . $this->route->c.$this->ctl_extra;

        //获取控制器路由
        $this->route_controller =
            Params::$RL.'App'.
            Params::$RL . $this->route->m .
            Params::$RL.'Controller'.
            Params::$RL . $this->route->c.$this->ctl_extra;

        //配置actioner的方法名
        $this->actioner = $this->route->a;
        //获取视图文件的基础控制器信息
        $this->path_viewer =
            Params::$RL.'App'.
            Params::$RL . $this->route->m .
            Params::$RL.'View'.
            Params::$RL . $this->route->c.
            Params::$RL . $this->route->a;
        //todo--还有什么参数需要初始化的话就在这里初始化就好了
    }

    /**
     * 初始化公共配置模块
     * User kuoqi
     * Datetime 2022/2/28 19:38
     * Remark
     */
    public function __initCommonConfig(){
        Error::process('加载公共配置');
        $file = new FileDriver();
        $file->setDirname(Params::$DS .'application'.Params::$DS . 'common');
        $file->setBasename('function.php');
        $file->includeFile(true);
        $file->setBasename('config.php');
        $config = $file->includeFile(true);
        if(is_array($config)){
            foreach($config as $k=>$v){
                Config::set($k,$v);
            }
        }
    }
    /**
     * 初始化私有模块配置
     * User kuoqi
     * Datetime 2022/4/27 16:33
     * Remark
     */
    public function __initPrivateConfig(){
        Error::process('加载模块私有化配置');
        $file = new FileDriver();
        $file->setDirname(Params::$DS .'application'.Params::$DS . \Kuoqi\Route::hump2code($this->route->m));
        $file->setBasename('function.php');
        $file->includeFile(true);
        //加载配置文件
        $file->setBasename('config.php');
        $config = $file->includeFile(true);
        if(is_array($config)){
            foreach($config as $k=>$v){
                Config::set($k,$v);
            }
        }
    }

    /**
     * 当前路由页面的classname
     * vbase
     * @return string
     */
    public function getClassname(){
        return 'App'.Config('RL').\Kuoqi::$app->route->m
            .Config('RL').'Controller'
            .Config('RL').\Kuoqi::$app->route->c.'Controller';
    }

    /**
     * 当前路由页面的基础名称
     * vbase
     * @return string
     */
    public function getBasename(){
        return \Kuoqi::$app->route->c.'Controller';
    }

    /**
     * 当前路由页面的命名空间
     * vbase
     * @return string
     */
    public function getNamespace(){
        return 'App'.Config('RL').\Kuoqi::$app->route->m
            .Config('RL').'Controller';
    }
    /**
     * App constructor.
     */
    public function __construct()
    {
        Error::process('应用对象初始化');

    }
    /**
     * __destruct system
     */
    public function __destruct()
    {
        Error::process('应用对象被销毁');
    }

}

